package org.andao.core.base.service;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.andao.core.base.model.RootModel;
import org.andao.core.dao.helper.Page;
import org.andao.core.dao.helper.QueryParameter;


/**
 * 基础的DAO Service接口，只提供一层薄封装，尽可能减少controller层的业务逻辑.
 *  
 * @author Seewo software - Marco.hu(huzhiguo@cvte.cn)
 * @param <T>
 */
public interface BaseService<T> {

	/**
	 * get object.
	 * @param id 序列化之后的ID
	 * @return	
	 */
	public  T get(Serializable id);
	
	/**
	 * get object for class type.
	 * @param clazz
	 * @param id
	 * @return
	 */
	public  Object get(Class<?> clazz,Serializable id);

	/**
	 * load object.
	 * @param id 序列化之后的ID
	 * @return	
	 */
	public T load(final Serializable id);
	
	/**
	 * load object for class type.
	 * @param clazz
	 * @param id
	 * @return
	 */
	public Object load(Class<?> clazz,final Serializable id);
	
	/**
	 * 根据hql查找唯一对象
	 * @param hql hql语句
	 * @param values hql属性
	 * @return 对象
	 */
	public T findUnique(String hql, Object... values);

	/**
	 * 根据属性查找唯一对象.
	 * @param propertyName 属性名
	 * @param value 属性值
	 * @return 对象.	
	 */
	public T findUniqueByProperty(String propertyName, Object value);

	/**
	 * 获取列表.
	 * @param includeDeleted
	 * @return
	 */
	public List<T> getAll(boolean includeDeleted);

	/**
	 * SaveOrUpdate
	 * @param entity
	 */
	public void saveOrUpdate(T entity);

	/**
	 * save
	 * @param entity
	 * @return  实体对象.
	 */	
	public T save(T entity);

	/**
	 * update
	 * @param entity
	 */
	public void update(T entity);

	/**
	 * merge
	 * @param entity
	 * @return 实体
	 */
	public T merge(T entity);

	/**
	 * persist方式保存
	 * @param entity
	 */
	public  void persist(T entity);

	/**
	 * 根据对象删除
	 * @param entity
	 */
	public void delete(T entity);

	/**
	 * 根据对象ID删除(逻辑)
	 * @param clazz
	 * @param id
	 */
	public void delete(Serializable id);

	/**
	 * 批量删除（逻辑）
	 * @param clazz
	 * @param ids	 
	 */
	public  void batchDelete(final String[] ids);
	/**
	 * 批量删除（逻辑）
	 * @param list	
	 */
	public void batchDelete(final  List<T> list);
	
	/**
	 * 删除实体(物理)
	 * @param entity
	 */
	public void truncate(Object entity);
	
	/**
	 * 根据对象属性物理删除
	 * @param clazz
	 * @param propertyName
	 * @param value
	 */
	public void truncateByProperty(Class<?> clazz, String propertyName, String value);
	
	/**
	 * 批量删除实体（物理）
	 * @param clazz
	 * @param ids
	 */
	public  void batchTruncate(Class<?> clazz,final String[] ids);
	
	/**
	 * 批量更新保存
	 * @param list	
	 */
	public void batchSaveOrUpdate(final  List<T> list);
	
	/**
	 * flush
	 *
	 */
	public abstract void flush() ;

	/**
	 * 清空指定对象缓存
	 * @param entity
	 */
	public void clearCache(T entity) ;

	/**
	 * 清空所有缓存
	 *
	 */
	public void clearAllCache();

	/**
	 * 重新加载
	 * @param proxy
	 */
	public void reloadLazy(Object proxy);

	/**
	 * 使用HQL方式查找对象列表.
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<T> findByHql(String hql, Object... values);
	
	/**
	 * 使用HQL方式查找列表，
	 * @param clazz 目標CLASS
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<?> findByHql(Class<?> clazz,String hql,Object... values);
	
	/**
	 * 使用HQL方式查找对象列表.
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<T> findByHql(String hql, Map<String, Object> values);
		
	/**
	 * 按HQL分页查询.
	 * 
	 * @param page 分页参数.
	 * @param hql hql语句.
	 * @param values 命名参数,按名称绑定.
	 * 
	 * @return 分页查询结果, 附带结果列表及所有查询时的参数.
	 */
	public Page findByHql(Page page, String hql, Map<String, Object> values);
	
	/**
	 * 根据条件查找制定model分页.
	 * @param page
	 * @param clazz
	 * @param paramenter
	 * @return
	 */
	public Page findByCondition(Page page,Class<? extends RootModel> clazz,QueryParameter paramenter);
		
	/**
	 * 根据实体ID查找实体对象集合.
	 * @param clazz 实体类.
	 * @param values ID集合
	 * @return 实体对象集合.
	 */
	public List<?> findEntitysByIds(Class<?> clazz,Collection<String> values);
		
	/**
	 * 获取数据源
	 * @return
	 */
	public  Connection getConn() throws SQLException;

	/**
	 * 按sql分页查询.
	 * 
	 * @param page 分页参数.
	 * @param sql sql语句.
	 * @param props 命名参数,按名称绑定.
	 * 
	 * @return 分页查询结果, 附带结果列表及所有查询时的参数.
	 */
	public Page findBySql(Page page, String sql, Class<?> targetClazz, Object props);

	/**
	 * 按HQL查询.
	 * 
	 * @param hql hql语句.
	 * @param query 命名参数,按名称绑定query.
	 * @return
	 * @brief
	 * @author Seewo Software - Vick.liu (liuguanglin@cvte.cn)
	 */
	List<T> findByHqlQuery(String hql, Object query);

	/**
	 * 按HQL分页查询.
	 * 
	 * @param objPage 分页参数.
	 * @param hql hql语句.
	 * @param query 命名参数,按名称绑定queryBean.
	 * @return
	 * @brief
	 * @author Seewo Software - Vick.liu (liuguanglin@cvte.cn)
	 */
	Page findByHqlQuery(Page objPage, String hql, Object query);			
	
}